package br.com.betioli.jme.games.sokobob.sprite;

import br.com.betioli.jme.games.sokobob.config.GameConfig;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;

/**
 * Classe geral para os atores do jogo. Consideraremos atores, o próprio jogador
 * e as peças que o mesmo pode mover já que seus movimenos serão semelhantes
 * 
 * @author Alexandre Parra Betioli
 */
public abstract class Actor extends Sprite {

    private int lastMove;

    public Actor(Image image, int width, int height) {
        super(image, width, height);
    }

    /**
     * Realiza um movimento para a esquerda
     */
    public void left() {
        lastMove = GameCanvas.LEFT_PRESSED;
        move(-GameConfig.SPRITE_STEP, 0);
    }

    /**
     * Realiza um movimento para a direita
     */
    public void right() {
        lastMove = GameCanvas.RIGHT_PRESSED;
        move(GameConfig.SPRITE_STEP, 0);
    }

    /**
     * Realiza um movimento para cima
     */
    public void up() {
        lastMove = GameCanvas.UP_PRESSED;
        move(0, -GameConfig.SPRITE_STEP);
    }

    /**
     * Realiza um movimento para baixo
     */
    public void down() {
        lastMove = GameCanvas.DOWN_PRESSED;
        move(0, GameConfig.SPRITE_STEP);
    }

    /**
     * Move o ator na direção desejada.
     */
    public void move( int direction ) {
        switch(direction) {
            case GameCanvas.LEFT_PRESSED  : left();  break;
            case GameCanvas.RIGHT_PRESSED : right(); break;
            case GameCanvas.UP_PRESSED    : up();    break;
            case GameCanvas.DOWN_PRESSED  : down();  break;           
        }
    }
    
    /**
     * Desfaz último movimento movendo o ator na direção contrária.
     * Utilizado em casos de colisão com paredes ou outros objetos.
     */
    public void undo() {
        switch(lastMove) {
            case GameCanvas.LEFT_PRESSED  : right(); break;
            case GameCanvas.RIGHT_PRESSED : left();  break;
            case GameCanvas.UP_PRESSED    : down();  break;
            case GameCanvas.DOWN_PRESSED  : up();    break;           
        }
    }
    
    /**
     * Retorna o último movimento realizado
     */
    public int getLastMove() {
        return lastMove;
    }
   
    /**
     * Define uma posição no cenário para este ator, considerando seu deslocamento
     */
    public void setPosition(int column, int row) {
        super.setPosition( column * GameConfig.SPRITE_STEP, row * GameConfig.SPRITE_STEP);
    }
    
}
